# coding=utf-8
from django.db import transaction
from django.db.models import Sum
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from warehouse_info.models import SaleDeliverItemModel
from sale_info.models import SaleItemModel, SaleModel
from MSB_ERP.utils.get_inventory import get_inventory


class SaleItemSerializer(serializers.ModelSerializer):

    # 注意：既然只有库存数据没有，那么可以增加一个属性
    cur_inventory = serializers.SerializerMethodField(label='当前仓库中的数量')

    # 额外增加的属性，为了后面的订单出库单。already_out_number：已经出库的数量
    already_out_number = serializers.SerializerMethodField(label='当前出库的数量')

    class Meta:
        model = SaleItemModel
        fields = '__all__'

    def get_cur_inventory(self,obj):
        result = get_inventory(obj.goods.id)
        return result if result else 0

    def get_already_out_number(self,obj): # 当前的obj为：SaleItemModel对象
        if obj.sale.status == '0' or obj.sale.status == '1':
            # 如果没有销售订单都没有出库，则不用查了，直接返回0
            return 0
        else:
            # 先根据销售的ID作为一个过滤条件，基于当前货品ID作为第二个过滤条件
            out_count = SaleDeliverItemModel.objects.filter(
                sale_deliver__sale__id = obj.sale.id,
                goods_id=obj.goods.id).exclude(sale_deliver__status='0') \
            .aggregate(sum=Sum('sale_count'))
            if out_count:
                return out_count['sum'] if out_count['sum'] else 0
            return 0

class SaleSerialzer(serializers.ModelSerializer):

    item_list = SaleItemSerializer(many=True,required=False)

    class Meta:
        model = SaleModel
        fields = '__all__'

    def create(self, validated_data):
        item_list = validated_data.pop('item_list') # 将子项目提取出来
        with transaction.atomic(): # 数据库事务
            sale = SaleModel.objects.create(**validated_data) # 将父项目添加进去
            for item in item_list: # 循环子项目
                sale_item = SaleItemModel.objects.create(sale=sale, **item) # 把子项目添加进去
                # 把一些冗余属性也加进去
                goods = item.get('goods')
                sale_item.specification = goods.specification
                sale_item.model_number = goods.model_number
                sale_item.number_code = goods.number_code
                sale_item.color = goods.color
                sale_item.units = goods.units
                sale_item.units_name = goods.units.basic_name
                sale_item.save()
        return sale

    def update(self, instance, validated_data): # 使用这个接口的时候，会传一个ID进来（也就是销售订单的ID），可以精确的定位到哪个一个表
        # instance表示正在修改的订单（也就是表里面的数据）
        if instance.status != '0': # 判断状态不是为0
            # 只要抛了异常后面的就不会执行了
            raise ValidationError('销售订单已经生效，不能修改')
        with transaction.atomic():  # 数据库事务
            item_list = validated_data.pop('item_list') # 把修改的子项目提取出来

            # 这里的意思是在instance（要修改的数据里面）找item_list里面的对象
            # 也就是查找表里面有没有旧数据
            old_list = instance.item_list.all() # 这是一个query对象，只有.all ...才是真正的列表
            if old_list.exists(): # 如果有旧数据的话
                old_list.delete() # 删除旧数据
                # instance.item_list.all().delete() # 删除旧数据

            for item in item_list:
                sale_item = SaleItemModel.objects.create(sale=instance,**item) # 将子项目的内容添加进去
                # 添加冗余字段
                goods = item.get('goods')
                sale_item.specification = goods.specification
                sale_item.model_number = goods.model_number
                sale_item.number_code = goods.number_code
                sale_item.color = goods.color
                sale_item.units = goods.units
                sale_item.units_name = goods.units.basic_name
                sale_item.save()
            # 调用父类的方法
            result = super(SaleSerialzer, self).update(instance=instance, validated_data=validated_data)
        return result













